﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CPTECH.Repository;
using CPTECH.Business;
using System.IO;
using System.Runtime.InteropServices;
using OpenNETCF.Tapi;

namespace CPTECH.Presentation
{
    public partial class frm_validarInv : frm_default
    {
        int lastFicticio = 0;

        public frm_validarInv()
        {
            InitializeComponent();
            checkFic();
        }

        //volta para o form anterior.
        private void mnu_voltar_Click(object sender, EventArgs e)
        {
            if (mnu_voltar.Text == "Voltar")
            {
                this.closeForm();
            }
            else
            {
                clear();
                lastFicticio = 0;
                bt_alterar.Text = "Fic.";
                pn_dados.Enabled = false;
                mnu_voltar.Text = "Voltar";
                mnu_confirmar.Enabled = false;
                mnu_confirmar.Text = "Confirmar";
                txt_plaqueta.Text = "";
                txt_plaqueta.Focus();
            }
        }

        //método que recebe os valores dos forms de seleção (filial, local, departamento, centroCusto e planta).
        public void sendedValues(string campo, string valor)
        {
            if (campo == "filial")
            {
                txt_filial.Text = valor;
            }

            else if (campo == "local")
            {
                txt_local.Text = valor;
            }

            else if (campo == "depto")
            {
                txt_depto.Text = valor;
            }

            else if (campo == "ccusto")
            {
                txt_cCusto.Text = valor;
            }

            else if (campo == "planta")
            {
                txt_planta.Text = valor;
            }
        }

        //gera ficticio se o texto = Fic.
        //habilita os campos pra alteração caso o texto for Alt.
        private void bt_alterar_Click(object sender, EventArgs e)
        {
            if (bt_alterar.Text == "Alt.")
            {
                pn_dados.Enabled = true;
                mnu_voltar.Text = "Cancelar";
                mnu_confirmar.Enabled = true;
                mnu_confirmar.Text = "Salvar";
                bt_selectFilial.Focus();
            }
            else
            {
                //gera Ficticio.
                generateFicticio();
                pn_dados.Enabled = true;
                mnu_voltar.Text = "Cancelar";
                mnu_confirmar.Enabled = true;
                mnu_confirmar.Text = "Salvar";
                bt_selectFilial.Focus();
            }
        }

        //No evento de leitura ou enter, preenche os campos com os dados dos itens, ou informa que o item n existe.
        private void txt_plaqueta_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(System.Windows.Forms.Keys.Enter))
            {
                if (txt_plaqueta.Text == "")
                {
                    MessageBox.Show("Insira um número de serial para prosseguir!", "Aviso");
                    txt_plaqueta.Focus();
                }
                else
                {
                    checkPlaqueta(txt_plaqueta.Text.Trim());
                }
            }

        }

        //verifica se o patrimõnio lido existe, se existe, retorna seus valores.
        public void checkPlaqueta(string plaqueta)
        {
            //preenche os campos com os valores do item.
            if (!FisicoDB.getInstance().checkPlaqueta(plaqueta))
            {
                var result = MessageBox.Show("Plaqueta não existe na base de dados, deseja cadastra-la?", "Novo Registro", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

                if (result == DialogResult.Yes)
                {
                    mnu_confirmar.Enabled = true;
                    mnu_confirmar.Text = "Salvar";
                    mnu_voltar.Text = "Cancelar";

                    pn_dados.Enabled = true;
                    bt_selectFilial.Focus();
                }
                else
                {
                    txt_plaqueta.Text = "";
                    txt_plaqueta.Focus();
                }
            }

            //habilita para a insersão.
            else
            {
                //preenche os campos com os valores.
                findValues();
                bt_alterar.Visible = true;
                mnu_confirmar.Enabled = true;
                bt_alterar.Text = "Alt.";
            }
        }

        //
        private void frm_validarInv_Load(object sender, EventArgs e)
        {
            mnu_confirmar.Enabled = false;
        }

        //Busca todos os valores do patrimônio selecionado.
        private void findValues()
        {
            string plaqueta = txt_plaqueta.Text;

            Fisico result = (Fisico)FisicoDB.getInstance().selectByPat(plaqueta)[0];
            txt_filial.Text = result.cdFisFilial;
            txt_local.Text = result.cdFisLocal;
            txt_depto.Text = result.cdFisDepto;
            txt_cCusto.Text = result.cdFisCcusto;
            txt_planta.Text = result.cdFisPlanta;
            txt_codItem.Text = result.cdDesc;
            txt_descItem.Text = result.dsItem;
            txt_marca.Text = result.marca;
            txt_modelo.Text = result.modelo;
            cbo_padrao.SelectedItem = result.padrao;
            txt_capacidade.Text = result.capacidade;
            txt_complemento.Text = result.complemento;
            txt_dtEstimada.Text = result.dtEstimada;
            txt_dtReal.Text = result.dtReal;
            txt_serial.Text = result.nrFabricacao;
            txt_livre1.Text = result.livre1;
            txt_livre2.Text = result.livre2;
            txt_livre3.Text = result.livre3;
            txt_livre4.Text = result.livre4;
            txt_partNumber.Text = result.partNumber;
            txt_patAntigo.Text = result.cdFisPatAntigo;
            cbo_situacao.SelectedItem = result.situacao;
            txt_tag.Text = result.tag;
            txt_fornecedor.Text = result.fornecedor;
        }

        //chama  o formulário de seleção de Filial.
        private void bt_selectFilial_Click(object sender, EventArgs e)
        {
            frm_filial filial = new frm_filial(null, this, 1);
            filial.showForm(this);

        }

        //chama o formulário de seleção de local.
        private void bt_selectLocal_Click(object sender, EventArgs e)
        {
            frm_local local = new frm_local(null, this, 1);
            local.showForm(this);
        }

        //chama o formulário de seleção de departamento.
        private void bt_selectDepto_Click(object sender, EventArgs e)
        {
            frm_departamento depto = new frm_departamento(null, this, 1);
            depto.showForm(this);
        }

        //chama o formulário de Centro de Custo.
        private void bt_selectCcusto_Click(object sender, EventArgs e)
        {
            frm_cCusto centro = new frm_cCusto(null, this, 1);
            centro.showForm(this);
        }

        //chama o formulário de planta
        private void bt_selectPlanta_Click(object sender, EventArgs e)
        {
            frm_planta planta = new frm_planta(null, this, 1);
            planta.showForm(this);
        }

        //verifica se é uma confirmação, alteração ou inserção e o faz.
        private void mnu_confirmar_Click(object sender, EventArgs e)
        {
            if (mnu_confirmar.Text == "Confirmar")
            {
                    //update plaqueta alterando seu status para revisado(2) e enviado (0)
                    FisicoDB.getInstance().updateRevisado(txt_plaqueta.Text.Trim(), "2", "0");
                    mnu_confirmar.Enabled = false;
                    clear();
                    txt_plaqueta.Text = "";
                    txt_plaqueta.Focus();
                    
                    //registra log da ação.
                    RegisterBO.getInstance().registerRevisao(txt_plaqueta.Text.Trim());

                    updatelastFic(lastFicticio);
            }
            
            //se serial existe é uma alteração, caso não exista é uma inserção.
            else
            {
                //se serial existe efetua a alteração.
                if(FisicoDB.getInstance().checkPlaqueta(txt_plaqueta.Text.Trim()) && validaCampos())
                {
                    updateSelectedPat();
                    clear();
                    pn_dados.Enabled = false;
                    bt_alterar.Text = "Fic.";
                    txt_plaqueta.Text = "";
                    txt_plaqueta.Focus();
                    mnu_confirmar.Enabled = false;
                    mnu_voltar.Text = "Voltar";
                    mnu_confirmar.Text = "Confirmar";

                    updatelastFic(lastFicticio);
                }
                //senão efetua a inserção.
                else
                {
                    if (validaCampos())
                    {
                        insertSelectedPat();
                        clear();
                        pn_dados.Enabled = false;
                        bt_alterar.Text = "Fic.";
                        txt_plaqueta.Text = "";
                        txt_plaqueta.Focus();
                        mnu_confirmar.Enabled = false;
                        mnu_voltar.Text = "Voltar";
                        mnu_confirmar.Text = "Confirmar";

                        updatelastFic(lastFicticio);
                    }
                }
            }
        }

        //limpa os campos
        private void clear()
        {
            txt_filial.Text ="";
            txt_local.Text = "";
            txt_depto.Text = "";
            txt_cCusto.Text = "";
            txt_planta.Text = "";
            txt_codItem.Text = "";
            txt_descItem.Text = "";
            txt_marca.Text = "";
            txt_modelo.Text = "";
            cbo_padrao.SelectedItem = "";
            txt_capacidade.Text = "";
            txt_complemento.Text = "";
            txt_dtEstimada.Text = "";
            txt_dtReal.Text = "";
            txt_serial.Text = "";
            txt_livre1.Text = "";
            txt_livre2.Text = "";
            txt_livre3.Text = "";
            txt_livre4.Text = "";
            txt_partNumber.Text = "";
            //txt_cdFisPatAnt.text = "";
            cbo_situacao.SelectedItem ="";
            txt_tag.Text = "";
            txt_fornecedor.Text = "";
        }

        //Método responsável por efetuar o update no banco.
        private void updateSelectedPat()
        {
            string plaqueta = txt_plaqueta.Text.Trim();
            string filial = txt_filial.Text;
            string local = txt_local.Text;
            string depto = txt_depto.Text;
            string ccusto = txt_cCusto.Text;
            string planta = txt_planta.Text;
            string cditem = txt_codItem.Text;
            string descitem = txt_descItem.Text;
            string modelo = txt_modelo.Text;
            string marca = txt_marca.Text;
            string padrao = cbo_padrao.SelectedItem.ToString();
            string dtestimada = txt_dtEstimada.Text;
            string dtreal = txt_dtReal.Text;
            string serial = txt_serial.Text;
            string complemento = txt_complemento.Text;
            string capacidade = txt_capacidade.Text;
            string partnumber = txt_partNumber.Text;
            string livre1 = txt_livre1.Text;
            string livre2 = txt_livre2.Text;
            string livre3 = txt_livre3.Text;
            string livre4 = txt_livre4.Text;
            string situacao = cbo_situacao.SelectedItem.ToString();
            string tag = txt_tag.Text;
            string fornecedor = txt_fornecedor.Text;
            string patAntigo = txt_patAntigo.Text;

            string data = DateTime.Now.ToString("dd/MM/yyyy hh:mm");
            string user = FisicoBO.getInstance().idPalm;
            string os = FisicoBO.getInstance().os;

            string status = "3";
            string enviado = "0";

            if (FisicoDB.getInstance().updateByCodPat(plaqueta, filial, depto, ccusto, local, planta, cditem, descitem, marca, modelo, padrao, dtestimada,
                dtreal, complemento, serial, capacidade, partnumber, livre1, livre2, livre3, livre4, situacao, tag, fornecedor, data, user, os,patAntigo, status,
                enviado))
            {
                MessageBox.Show("Item alterado com sucesso!", "Item Alterado");

                //registra log da ação.
                RegisterBO.getInstance().registerUpdate(plaqueta);
            }
            else
            {
                MessageBox.Show("Erro ao tentar alterar o registro!, entrar em contato com o suporte!", "Erro");
            }

        }

        //Método responsável por efetuar o insert de um novo resgistro.
        private void insertSelectedPat()
        {
            Int64 lastID = FisicoDB.getInstance().getLastID();
            lastID = lastID++;
            string plaqueta = txt_plaqueta.Text.Trim();
            string filial = txt_filial.Text;
            string local = txt_local.Text;
            string depto = txt_depto.Text;
            string ccusto = txt_cCusto.Text;
            string planta = txt_planta.Text;
            string cditem = txt_codItem.Text;
            string descitem = txt_descItem.Text;
            string modelo = txt_modelo.Text;
            string marca = txt_marca.Text;
            string padrao = cbo_padrao.SelectedItem.ToString();
            string dtestimada = txt_dtEstimada.Text;
            string dtreal = txt_dtReal.Text;
            string serial = txt_serial.Text;
            string complemento = txt_complemento.Text;
            string capacidade = txt_capacidade.Text;
            string partnumber = txt_partNumber.Text;
            string livre1 = txt_livre1.Text;
            string livre2 = txt_livre2.Text;
            string livre3 = txt_livre3.Text;
            string livre4 = txt_livre4.Text;
            string situacao = cbo_situacao.SelectedItem.ToString();
            string tag = txt_tag.Text;
            string fornecedor = txt_fornecedor.Text;
            string patAntigo = txt_patAntigo.Text;
            string cdFisInc = "0";

            string data = DateTime.Now.ToString("dd/MM/yyyy hh:mm");
            string user = FisicoBO.getInstance().idPalm;
            string os = FisicoBO.getInstance().os;

            string status = "1";
            string enviado = "0";

            if (FisicoDB.getInstance().insertNewFisico( lastID, filial, plaqueta, cdFisInc, status, planta, depto, ccusto, local, cditem, descitem, marca,
                modelo, capacidade, complemento, serial, dtestimada, livre1, livre2, livre3, livre4, user, data, os, patAntigo, partnumber, situacao, tag,
                padrao, dtreal, fornecedor, enviado))
            {
                MessageBox.Show("Item Inserido com Sucesso!", "Novo Item");

                //registra log da ação.
                RegisterBO.getInstance().registerInclude(plaqueta);

                string last = lastID.ToString();
                putLastID(last);
            }
            else
            {
                MessageBox.Show("Erro ao tentar inserir o registro!, entrar em contato com o suporte!", "Erro");
            }

        }

        //grava ultima idSeq feita.
        private void putLastID(string lastID)
        {
            //endereço de onde será gerado o arquivo.
            TextWriter last = new StreamWriter((System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastID.txt"));

            last.WriteLine(lastID);
            last.Close();
        }

        //confirma campos obrigatórios.
        private bool validaCampos()
        {
            bool result = true;

            if (txt_filial.Text == "")
            {
                MessageBox.Show("Insira uma Filial para continuar!", "Filial");
                txt_filial.Focus();
                result = false;
            }

            else if (txt_descItem.Text == "")
            {
                MessageBox.Show("Insira uma descrição do item para continuar!","Desc. item");
                txt_descItem.Focus();
                result = false;
            }

            else if (cbo_padrao.SelectedItem == null)
            {
                MessageBox.Show("Selecione um padrão para continuar!","Padrão");
                cbo_padrao.Focus();
                result = false;
            }

            else if (txt_dtEstimada.Text == "")
            {
                MessageBox.Show("Insira uma data estimada para continuar!", "Data Estimada");
                txt_dtEstimada.Focus();
                result = false;
            }

            else if (txt_dtReal.Text == "")
            {
                MessageBox.Show("Insira uma data real para continuar!", "Data Real");
                txt_dtReal.Focus();
                result = false;
            }

            else if (cbo_situacao.SelectedItem == null)
            {
                MessageBox.Show("Selecione uma situação para continuar!", "Situação");
                cbo_situacao.Focus();
                result = false;
            }

            else { result = true; }

            return result;
        }

        //verifica se o código de item informado existe ou não, se sim retorna os valores do item.
        private void bt_pesquisar_Click(object sender, EventArgs e)
        {
            if (txt_codItem.Text == "")
            {
                MessageBox.Show("Insira um código para continuar!", "Item");
                txt_codItem.Focus();
            }
            else
            {
                txt_codItem.Text = txt_codItem.Text.ToUpper().Trim();
                string codItem = txt_codItem.Text;
                try
                {
                    CodPad result = (CodPad)CodPadDB.getInstance().selectByCodPad(codItem)[0];

                    if (result == null)
                    {
                        txt_descItem.Text = "NÃO POSSUI";
                        txt_marca.Text = "NÃO POSSUI";
                        txt_modelo.Text = "NÃO POSSUI";
                    }
                    else
                    {
                        txt_descItem.Text = result.DS_PAD.ToString();
                        txt_marca.Text = result.MARCA.ToString();
                        txt_modelo.Text = result.MODELO.ToString();
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("Código de item não encontrado na base, verifique!", "Item não encontrado.");
                    txt_codItem.Focus();
                }
            }
        }

        //habilita somente números no campo.
        private void txt_dtEstimada_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
                MessageBox.Show("Somente números são permitidos neste campo!", "Aviso");
                txt_dtEstimada.Text = "";
                txt_dtEstimada.Focus();
            }
        }

        //habilita somente números no campo.
        private void txt_dtReal_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar))
            {
                e.Handled = true;
                MessageBox.Show("Somente números são permitidos neste campo!", "Aviso");
                txt_dtReal.Text = "";
                txt_dtReal.Focus();
            }
        }

        // get IMEI code.
        public static string getIMEIInfo()
        {
            Line line;
            Tapi tapi;

            int ret = 0;

            tapi = new Tapi();
            tapi.Initialize();
            line = tapi.CreateLine(0, LINEMEDIAMODE.DATAMODEM,
            OpenNETCF.Tapi.LINECALLPRIVILEGE.OWNER |
            OpenNETCF.Tapi.LINECALLPRIVILEGE.MONITOR);

            LINEOPERATOR lop = new LINEOPERATOR();
            byte[] data = new byte[lop.SizeOf];
            ret = CellTSP.lineGetCurrentOperator(line.hLine, data);
            ByteCopy.ByteArrayToStruct(data, lop);
            OpenNETCF.Tapi.LINEGENERALINFO lgi =
                   new OpenNETCF.Tapi.LINEGENERALINFO(1024);
            lgi.Store();
            ret = CellTSP.lineGetGeneralInfo(line.hLine, lgi.Data);
            lgi.Load();

            return lgi.SerialNumber.Substring(0, 15);
        }

        //gera o número de ficticio e set no txt_plaqueta.
        private void generateFicticio()
        {
            lastFicticio = getLastFic();
            string imei = getIMEIInfo();
            lastFicticio++;
            txt_plaqueta.Text = ("FIC" + imei + (lastFicticio.ToString()));
        }

        private int getLastFic()
        {
            int last = 0;
            StreamReader sr = new StreamReader((System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastFic.txt"));
            while (!sr.EndOfStream)
            {
                last = int.Parse(sr.ReadLine());
            }
            sr.Close();
            return last;
        }

        //verifica se arquivo existe.
        private void checkFic()
        {
            if (!File.Exists(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastFic.txt"))
            {
                TextWriter fic = new StreamWriter((System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastFic.txt"));
                fic.WriteLine("0");
                fic.Close();
            }
        }

        //atualiza o ultimo ficticio gerado.
        private void updatelastFic(int lastFic)
        {
            TextWriter fic = new StreamWriter((System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\lastFic.txt"));
            fic.WriteLine(lastFic);
            fic.Close();
        }
    }
}